package interfaz;

import javax.swing.*;
import javax.xml.parsers.ParserConfigurationException;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

public class GeneradorGUI extends JFrame
{

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JList listaUsuarios = null;

	private JList listaAmigos = null;

	private JList listaArchivos = null;

	private JPanel panelOpciones = null;

	private JButton btnAgregarUsuario = null;

	private JButton btnAgAmigo = null;

	private JButton btnAgArchivo = null;

	private JButton btnElUsuario = null;

	private JButton btnElAmigo = null;

	private JButton btnElArchivo = null;

	private JButton btnGenerarXML = null;

	private JPanel panelTitulos = null;

	private JLabel lblUsuarios = null;

	private JLabel lblAmigos = null;

	private JLabel lblArchivos = null;
	
	private GeneradorXML genXML;
	
	/**
	 * This is the default constructor
	 */
	public GeneradorGUI() {
		super();
		genXML = new GeneradorXML();
		initialize();
		actualizar();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(600, 400);
		this.setContentPane(getJContentPane());
		this.setTitle("Generador XML de una Red Joy");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getListaUsuarios(), BorderLayout.WEST);
			jContentPane.add(getListaAmigos(), BorderLayout.CENTER);
			jContentPane.add(getListaArchivos(), BorderLayout.EAST);
			jContentPane.add(getPanelOpciones(), BorderLayout.SOUTH);
			jContentPane.add(getPanelTitulos(), BorderLayout.NORTH);
		}
		return jContentPane;
	}

	/**
	 * This method initializes listaUsuarios	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getListaUsuarios() {
		if (listaUsuarios == null) {
			listaUsuarios = new JList();
			listaUsuarios.setPreferredSize(new Dimension(175, 100));
			listaUsuarios.setBackground(new Color(236, 255, 236));
			listaUsuarios.addMouseListener( new MouseListener()
			{
				public void mouseClicked(MouseEvent e)
				{
					mostrarPropUsuarioSeleccionado( );
				}
				public void mouseEntered(MouseEvent e){ }
				public void mouseExited(MouseEvent e){ }
				public void mousePressed(MouseEvent e){ }
				public void mouseReleased(MouseEvent e){ }
			});
		}
		return listaUsuarios;
	}

	/**
	 * This method initializes listaAmigos	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getListaAmigos() {
		if (listaAmigos == null) {
			listaAmigos = new JList();
			listaAmigos.setPreferredSize(new Dimension(175, 100));
			listaAmigos.setBackground(new Color(245, 250, 255));
			listaAmigos.addMouseListener( new MouseListener()
			{
				public void mouseClicked(MouseEvent e) { actualizarBtnElAmigo(); }
				public void mouseEntered(MouseEvent e) { }
				public void mouseExited(MouseEvent e) { }
				public void mousePressed(MouseEvent e){ }
				public void mouseReleased(MouseEvent e){ }
			});
		}
		return listaAmigos;
	}

	/**
	 * This method initializes listaArchivos	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getListaArchivos() {
		if (listaArchivos == null) {
			listaArchivos = new JList();
			listaArchivos.setPreferredSize(new Dimension(250, 100));
			listaArchivos.setBackground(new Color(255, 254, 238));
			listaArchivos.addMouseListener( new MouseListener()
			{
				public void mouseClicked(MouseEvent e) { actualizarBtnElArchivo(); }
				public void mouseEntered(MouseEvent e) { actualizarBtnElArchivo(); }
				public void mouseExited(MouseEvent e) { actualizarBtnElArchivo(); }
				public void mousePressed(MouseEvent e){ }
				public void mouseReleased(MouseEvent e){ }
			});
		}
		return listaArchivos;
	}

	/**
	 * This method initializes panelOpciones	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPanelOpciones() {
		if (panelOpciones == null) {
			GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
			gridBagConstraints6.gridx = 0;
			gridBagConstraints6.gridwidth = 3;
			gridBagConstraints6.fill = GridBagConstraints.HORIZONTAL;
			gridBagConstraints6.gridy = 2;
			GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
			gridBagConstraints5.gridx = 2;
			gridBagConstraints5.gridy = 1;
			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
			gridBagConstraints4.gridx = 1;
			gridBagConstraints4.gridy = 1;
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.gridx = 0;
			gridBagConstraints3.gridy = 1;
			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
			gridBagConstraints2.gridx = 2;
			gridBagConstraints2.gridy = 0;
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.gridx = 1;
			gridBagConstraints1.gridy = 0;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.gridy = 0;
			panelOpciones = new JPanel();
			panelOpciones.setLayout(new GridBagLayout());
			panelOpciones.setPreferredSize(new Dimension(600, 80));
			panelOpciones.add(getBtnAgregarUsuario(), gridBagConstraints);
			panelOpciones.add(getBtnAgAmigo(), gridBagConstraints1);
			panelOpciones.add(getBtnAgArchivo(), gridBagConstraints2);
			panelOpciones.add(getBtnElUsuario(), gridBagConstraints3);
			panelOpciones.add(getBtnElAmigo(), gridBagConstraints4);
			panelOpciones.add(getBtnElArchivo(), gridBagConstraints5);
			panelOpciones.add(getBtnGenerarXML(), gridBagConstraints6);
		}
		return panelOpciones;
	}

	/**
	 * This method initializes btnAgregarUsuario	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnAgregarUsuario() {
		if (btnAgregarUsuario == null) {
			btnAgregarUsuario = new JButton();
			btnAgregarUsuario.setText("Agregar usuario");
			btnAgregarUsuario.setPreferredSize(new Dimension(174, 26));
			btnAgregarUsuario.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String ip = JOptionPane.showInputDialog(null, "IP del nuevo usuario:");
					genXML.addUsuario( ip );
					actualizar();
				}
			});
		}
		return btnAgregarUsuario;
	}

	/**
	 * This method initializes btnAgAmigo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnAgAmigo() {
		if (btnAgAmigo == null) {
			btnAgAmigo = new JButton();
			btnAgAmigo.setText("Agregar amigo");
			btnAgAmigo.setPreferredSize(new Dimension(168, 26));
			btnAgAmigo.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String ipAmigo = JOptionPane.showInputDialog(null, "IP del nuevo amigo:");
					String ipUsuario = getListaUsuarios().getSelectedValue().toString();
					genXML.addAmigo( ipUsuario, ipAmigo );
					genXML.addUsuario( ipAmigo );
					genXML.addAmigo( ipAmigo, ipUsuario );
					actualizar();
					actualizarBtnElAmigo();
				}
			});
		}
		return btnAgAmigo;
	}

	/**
	 * This method initializes btnAgArchivo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnAgArchivo() {
		if (btnAgArchivo == null) {
			btnAgArchivo = new JButton();
			btnAgArchivo.setText("Agregar archivo");
			btnAgArchivo.setPreferredSize(new Dimension(250, 26));
			btnAgArchivo.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String nombreArchivo = JOptionPane.showInputDialog(null, "Nombre del nuevo archivo:");
					String ipUsuario = getListaUsuarios().getSelectedValue().toString();
					genXML.addArchivo( ipUsuario, nombreArchivo );
					actualizar();
					actualizarBtnElArchivo();
				}
			});
		}
		return btnAgArchivo;
	}

	/**
	 * This method initializes btnElUsuario	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnElUsuario() {
		if (btnElUsuario == null) {
			btnElUsuario = new JButton();
			btnElUsuario.setText("Eliminar usuario");
			btnElUsuario.setPreferredSize(new Dimension(174, 26));
			btnElUsuario.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String ipUsuario = getListaUsuarios().getSelectedValue().toString();
					genXML.removeUsuario( ipUsuario );
					actualizar();
				}
			});
		}
		return btnElUsuario;
	}

	/**
	 * This method initializes btnElAmigo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnElAmigo() {
		if (btnElAmigo == null) {
			btnElAmigo = new JButton();
			btnElAmigo.setText("Eliminar amigo");
			btnElAmigo.setPreferredSize(new Dimension(168, 26));
			btnElAmigo.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String ipAmigo = getListaAmigos().getSelectedValue().toString();
					String ipUsuario = getListaUsuarios().getSelectedValue().toString();
					genXML.removeAmigo(ipUsuario, ipAmigo);
					actualizarBtnElAmigo();
					mostrarPropUsuarioSeleccionado( );
				}
			});
		}
		return btnElAmigo;
	}

	/**
	 * This method initializes btnElArchivo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnElArchivo() {
		if (btnElArchivo == null) {
			btnElArchivo = new JButton();
			btnElArchivo.setText("Eliminar archivo");
			btnElArchivo.setPreferredSize(new Dimension(250, 26));
			btnElArchivo.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String nombreArchivo = getListaArchivos().getSelectedValue().toString();
					String ipUsuario = getListaUsuarios().getSelectedValue().toString();
					genXML.removeArchivo( ipUsuario, nombreArchivo );
					actualizarBtnElArchivo();
					mostrarPropUsuarioSeleccionado( );
				}
			});
		}
		return btnElArchivo;
	}

	/**
	 * This method initializes btnGenerarXML	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnGenerarXML() {
		if (btnGenerarXML == null) {
			btnGenerarXML = new JButton();
			btnGenerarXML.setText("Generar XML");
			btnGenerarXML.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					try {
						genXML.generarXML();
					} catch (IOException e1) {
						JOptionPane.showMessageDialog( null, "No se pudo escribir el archivo XML", "Error de escritura sobre XML", JOptionPane.ERROR_MESSAGE);
					} catch (ParserConfigurationException e1) {
						JOptionPane.showMessageDialog( null, "No se pudo escribir el archivo XML, error en la generacin de las etiquetas XML", "Error de escritura sobre XML", JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
		return btnGenerarXML;
	}

	/**
	 * This method initializes panelTitulos	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPanelTitulos() {
		if (panelTitulos == null) {
			lblArchivos = new JLabel();
			lblArchivos.setText("Archivos:");
			lblArchivos.setPreferredSize(new Dimension(250, 16));
			lblArchivos.setHorizontalAlignment(SwingConstants.CENTER);
			lblAmigos = new JLabel();
			lblAmigos.setText("Amigos:");
			lblAmigos.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			lblAmigos.setPreferredSize(new Dimension(175, 16));
			lblAmigos.setHorizontalAlignment(SwingConstants.CENTER);
			lblUsuarios = new JLabel();
			lblUsuarios.setText("Usuarios:");
			lblUsuarios.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			lblUsuarios.setHorizontalAlignment(SwingConstants.CENTER);
			lblUsuarios.setPreferredSize(new Dimension(175, 16));
			panelTitulos = new JPanel();
			panelTitulos.setLayout(new BorderLayout());
			panelTitulos.setPreferredSize(new Dimension(600, 20));
			panelTitulos.add(lblUsuarios, BorderLayout.WEST);
			panelTitulos.add(lblAmigos, BorderLayout.CENTER);
			panelTitulos.add(lblArchivos, BorderLayout.EAST);
		}
		return panelTitulos;
	}
	
	public void actualizar ( )
	{
		listaUsuarios.setListData( genXML.getUsuarios().toArray() );
		listaUsuarios.setSelectedIndex( 0 );
		int totalUsuarios = genXML.getTotalUsuarios();
		if ( totalUsuarios == 0 )
		{
			btnAgAmigo.setEnabled( false );
			btnAgArchivo.setEnabled( false );
			btnElUsuario.setEnabled( false );
			btnElAmigo.setEnabled( false );
			btnElArchivo.setEnabled( false );
			btnGenerarXML.setEnabled( false );
		}
		else
		{
			btnAgAmigo.setEnabled( true );
			btnAgArchivo.setEnabled( true );
			btnGenerarXML.setEnabled( true );
			btnElUsuario.setEnabled( true );
		}
		mostrarPropUsuarioSeleccionado();
	}
	
	public void mostrarPropUsuarioSeleccionado ( )
	{
		Object o = listaUsuarios.getSelectedValue();
		if ( o!= null )
		{
			String ip = o.toString();
			mostrarAmigos( ip );
			mostrarArchivos( ip );
			int cantAmigos = genXML.getAmigosDeUsuario( ip ).size();
			if ( cantAmigos == 0 || listaAmigos.getSelectedValue() == null )
				btnElAmigo.setEnabled( false );
			int cantArchivos = genXML.getArchivosDeUsuario( ip ).size();
			if ( cantArchivos == 0 || listaArchivos.getSelectedValue() == null )
				btnElArchivo.setEnabled( false );
		}
	}
	
	public void actualizarBtnElAmigo ( )
	{
		if ( getListaAmigos().getSelectedValue() != null )
			btnElAmigo.setEnabled( true );
		else
			btnElAmigo.setEnabled( false );
	}
	
	public void actualizarBtnElArchivo ( )
	{
		if ( getListaArchivos().getSelectedValue() != null )
			btnElArchivo.setEnabled( true );
		else
			btnElArchivo.setEnabled( false );
	}
	
	public void mostrarAmigos ( String ip )
	{
		int totalUsuarios = genXML.getTotalUsuarios();
		if ( totalUsuarios > 0 )
			listaAmigos.setListData( genXML.getAmigosDeUsuario( ip ).toArray() );
	}
	
	public void mostrarArchivos ( String ip )
	{
		int totalUsuarios = genXML.getTotalUsuarios();
		if ( totalUsuarios > 0 )
			listaArchivos.setListData( genXML.getArchivosDeUsuario( ip ).toArray() );
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				@SuppressWarnings("unused")
				GeneradorGUI thisClass = new GeneradorGUI();
			}
		});
	}

}
